#include "musicdb.h"
#include <QDebug>

MusicDB::MusicDB(QObject *parent) :
    QObject(parent)
{

}

/**
 * @brief 从数据库获取MP3文件路径
 *
 * @return QList<QString> MP3路径列表
 */
QList<QString> MusicDB::getMusicPath()
{
    QList<QString> musicList;
    QSqlDatabase db = QSqlDatabase::database("my.db");
    QSqlQuery query(db);

    query.exec(QString("select musicPath from music "
                       "where isDelete = 0"));
    while(query.next())
    {
        musicList.append(query.value(0).toString());
    }
    return musicList;
}

/**
 * @brief 逻辑删除数据库音乐
 *
 * @param musicName
 */
void MusicDB::removeMusic(const QString &musicName)
{
    QSqlDatabase db = QSqlDatabase::database("my.db");
    QSqlQuery query(db);
    query.exec(QString("update music set isDelete = 1 "
                       "where musicPath like '%%1'").arg(musicName));
}

/**
 * @brief 搜索音乐文件槽函数
 *
 */
void MusicDB::searchMusic()
{
#ifdef WIN32
    bool find = searchMp3File("D:/Documents/Music/");
#endif

#ifdef ANDROID
//    bool find = searchMp3File(QDir::rootPath());
    bool find = searchMp3File("/sdcard/");
#endif

    if ( find == true)
    {
        this->insertMusic();
    }
}

/**
 * @brief 递归遍历文件夹，找到所有的mp3文件
 *
 * @param rootPath 要遍历的文件夹的根目录
 * @return bool 成功找到所以MP3返回true, 否则返回false
 */
bool MusicDB::searchMp3File(const QString &rootPath)
{
    QDir dir(rootPath);
    //判断根目录是否存在
    if (!dir.exists())
    {
        return false;
    }

    //取到所有的文件和文件名，但是去掉.和..的文件夹（这是QT默认有的）
    dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);

    //文件夹优先
    dir.setSorting(QDir::DirsFirst);

    //转化成一个list
    QFileInfoList list = dir.entryInfoList();
    if(list.size() < 1 )
    {
        return false;
    }

    foreach (QFileInfo fileInfo, list)
    {
        //如果是目录继续递归
        if(fileInfo.isDir() == true)
        {
            searchMp3File(fileInfo.filePath());
        }//end if
        else
        {
            //如果是文件，筛选出后缀为.mp3且文件大于1M的文件
            if (fileInfo.fileName().endsWith(".mp3") == true
                    && fileInfo.size() > 1024 * 1024)
            {
                //将获取的mp3文件路径存入Mp3Path
                Mp3Path.append(fileInfo);
            }//end if
        }//end else
    }//end foreach
    return true;
}

/**
 * @brief 将找到的音乐文件插入数据库
 *
 * @return void
 */
void MusicDB::insertMusic()
{
    QSqlDatabase db = QSqlDatabase::database("my.db");
    QSqlQuery query(db);

    foreach (QFileInfo mp3, Mp3Path)
    {
        //构造插入数据库sql语句
        QString sql = QString("INSERT INTO \"music\" VALUES ('%1', '%2', 0)")
                .arg(mp3.baseName()).arg(mp3.filePath());
        //执行sql语句
        query.exec(sql);
    }
}
